package com.example.utils;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;

/**
 * @Author: 张比特
 * @Data: 2025/2/10 下午4:23
 * @Version: v1.0.0
 * @Description: TODO 临时文件工具
 **/
public class tempFileUtil {

    // 临时文件前缀
    public static final String TEMP_DIR_PREFIX = "Temp_";

    // 私有构造方法，避免实例化
    private tempFileUtil() {
        throw new UnsupportedOperationException("拒绝实例化");
    }

    /**
     * 创建一个临时文件
     *
     * @param prefix 文件名前缀
     * @param suffix 文件名后缀
     * @return 临时文件路径
     * @throws IOException
     */
    public static Path createTempFile(String prefix, String suffix) throws IOException {
        return Files.createTempFile(prefix, suffix);
    }

    /**
     * 创建一个临时文件夹
     *
     * @param prefix 文件夹名前缀
     * @return 临时文件夹路径
     * @throws IOException
     */
    public static Path createTempDirectory(String prefix) throws IOException {
        return Files.createTempDirectory(prefix);
    }

    /**
     * 删除文件或文件夹
     *
     * @param path 要删除的文件或文件夹路径
     * @throws IOException
     */
    public static void delete(Path path) throws IOException {
        if (Files.isDirectory(path)) {
            deleteDirectory(path);
        } else {
            Files.delete(path);
        }
    }

    /**
     * 删除文件夹及其内容
     *
     * @param dirPath 要删除的文件夹路径
     * @throws IOException
     */
    private static void deleteDirectory(Path dirPath) throws IOException {
        // 使用 Files.walk 删除目录中的内容（逆序删除）
        Files.walkFileTree(dirPath, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Files.delete(file);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                Files.delete(dir); // 删除目录
                return FileVisitResult.CONTINUE;
            }
        });
    }

    /**
     * 删除临时文件夹内所有文件，并删除临时文件夹
     *
     * @param dirPath 要删除的文件夹路径
     * @throws IOException
     */
    public static void deleteTempDirectory(Path dirPath) throws IOException {
        if (Files.exists(dirPath) && Files.isDirectory(dirPath)) {
            deleteDirectory(dirPath);
            System.out.println("临时文件夹已删除: " + dirPath);
        } else {
            System.out.println("指定路径不是一个有效的文件夹: " + dirPath);
        }
    }

    /**
     * 删除所有指定路径的临时文件
     *
     * @param filePaths 文件路径列表
     * @throws IOException
     */
    public static void deleteTempFiles(List<Path> filePaths) throws IOException {
        for (Path filePath : filePaths) {
            if (Files.exists(filePath)) {
                Files.delete(filePath);
                System.out.println("已删除临时文件: " + filePath);
            } else {
                System.out.println("文件不存在: " + filePath);
            }
        }
    }
}
